package com.dys.testconcurrentmap13;

import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @className: com.dys.testconcurrentmap13.ConcurrentMapTest
 * @description: com.dys.testconcurrentmap13
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/10 下午5:28
 */
public class ConcurrentMapTest {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        new ConcurrentMapTest().testCurrentHashMap();
    }

    /**
     * 线程安全，性能低
     */
    public void testHashTable() {
        Hashtable ht = new Hashtable();
        // 创建10个线程
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int j = 0; j < 1000000; j++) {
                        ht.put("test" + j, j);
                    }
                    long endTime = System.currentTimeMillis();
                    System.out.println("一共需要的时间: " + (endTime - startTime));
                }
            }).start();
        }
    }

    /**
     * 线程不安全，性能高
     */
    public void testHashMap() {
        HashMap hm = new HashMap();
        // 创建10个线程
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int j = 0; j < 1000000; j++) {
                        hm.put("test" + j, j);
                    }
                    long endTime = System.currentTimeMillis();
                    System.out.println("一共需要的时间: " + (endTime - startTime));
                }
            }).start();
        }
    }

    /**
     * 线程安全的HashMap: 线程安全，性能低
     */
    public void testThiredHashMap() {
        HashMap oldHashMap = new HashMap();
        Map hm = Collections.synchronizedMap(oldHashMap);
        // 创建10个线程
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int j = 0; j < 1000000; j++) {
                        hm.put("test" + j, j);
                    }
                    long endTime = System.currentTimeMillis();
                    System.out.println("一共需要的时间: " + (endTime - startTime));
                }
            }).start();
        }
    }

    /**
     * ConcurrentHashMap: 性能高，线程安全
     */
    public void testCurrentHashMap() {
        ConcurrentHashMap chm = new ConcurrentHashMap();
        // 创建10个线程
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    long startTime = System.currentTimeMillis();
                    for (int j = 0; j < 1000000; j++) {
                        chm.put("test" + j, j);
                    }
                    long endTime = System.currentTimeMillis();
                    System.out.println("一共需要的时间: " + (endTime - startTime));
                }
            }).start();
        }
    }
}
